package cn.detu.ln.service.impl;

import cn.detu.ln.entity.Selection;
import cn.detu.ln.mapper.SelectionMapper;
import cn.detu.ln.service.SelectionService;
import cn.detu.ln.utils.RestUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;

@Service
public class SelectionServiceImpl implements SelectionService {
    @Autowired
    private SelectionMapper selectionMapper;
    @Override
    public RestUtil selectAll() {
        return new RestUtil(200,"",selectionMapper.selectList(null));
    }


    @Override
    public Selection querySelectionById(Integer selId) {
        return selectionMapper.selectOne(new QueryWrapper<Selection>().eq("sel_id",selId));
    }

    @Override
    public Selection querySelectionByStuId(Long stuNum) {
        return selectionMapper.selectOne(new QueryWrapper<Selection>().eq("stu_num",stuNum));
    }

    @Override
    public RestUtil selectionDelete(Integer selId) {
        return selectionMapper.deleteById(selId)>0?new RestUtil(200,"恭喜，退选成功！！！",null):new RestUtil(500,"很遗憾，退选失败了！！！",
                null);
    }

    @Override
    public RestUtil selectSelIdByCouId(Integer couId) {
        Selection selection = selectionMapper.selectOne(new QueryWrapper<Selection>().eq("cou_id",couId));
        if(selection == null) return new RestUtil(500,"您并未选择该课程，不可退选！",null);
        return new RestUtil(200,"查询成功！",selection.getSelId());
    }

    @Override
    public RestUtil querySelectionByCouIdPage(Integer current, Integer rows, Integer couId) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Selection> queryWrapper = (couId != null )?
                new QueryWrapper<Selection>().eq("cou_id",couId) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Selection> coursePage = selectionMapper.selectPage(new Page<Selection>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",coursePage.getTotal());// 总条数
        map.put("pages",coursePage.getPages());// 总页数
        map.put("selections",coursePage.getRecords());// 当前页数据
        return coursePage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    public RestUtil judgeSelectionByCouId(Integer couId) {
        Selection selection = selectionMapper.selectOne(new QueryWrapper<Selection>().eq("cou_id",couId));
        if(selection == null) return new RestUtil(200,"老师，很遗憾，暂时还未有学生选择该门课程，请耐心等待！！！",null);
        return new RestUtil(500,"您的课程已被学生选择！！！",null);
    }

    @Override
    public RestUtil selectionUpdate(Selection selection) {
        return selectionMapper.updateById(selection)>0?new RestUtil(200,"修改成功",null):new RestUtil(500,"修改失败",null);
    }

    @Override
    public RestUtil selectionInsert(Selection selection) {
        return selectionMapper.insert(selection)>0?new RestUtil(200,"添加成功",null):new RestUtil(500,"添加失败",null);
    }

    @Override
    // 按照课程性质实现模糊查询
    public RestUtil querySelectionByCourseNaturePage(Integer current, Integer rows, String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Selection> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Selection>().like("cou_nature",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Selection> coursePage = selectionMapper.selectPage(new Page<Selection>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",coursePage.getTotal());// 总条数
        map.put("pages",coursePage.getPages());// 总页数
        map.put("selections",coursePage.getRecords());// 当前页数据
        return coursePage != null ? new RestUtil(200,"",map) : null;
    }


    @Override
    // 课程id + 学号
    public RestUtil querySelCourseByIdPage(Integer current, Integer rows,Long stuNum, String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Selection> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Selection>().eq("stu_num",stuNum).eq("cou_id",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Selection> coursePage = selectionMapper.selectPage(new Page<Selection>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",coursePage.getTotal());// 总条数
        map.put("pages",coursePage.getPages());// 总页数
        map.put("selcourses",coursePage.getRecords());// 当前页数据
        return coursePage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    // 课程性质+学号
    public RestUtil querySelCourseByPage(Integer current, Integer rows,Long stuNum, String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Selection> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Selection>().eq("stu_num",stuNum).like("cou_nature",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Selection> coursePage = selectionMapper.selectPage(new Page<Selection>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",coursePage.getTotal());// 总条数
        map.put("pages",coursePage.getPages());// 总页数
        map.put("selections",coursePage.getRecords());// 当前页数据
        return coursePage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    public RestUtil querySelectionByStuNumPage(Integer current, Integer rows, String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Selection> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Selection>().eq("stu_num",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Selection> coursePage = selectionMapper.selectPage(new Page<Selection>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",coursePage.getTotal());// 总条数
        map.put("pages",coursePage.getPages());// 总页数
        map.put("selections",coursePage.getRecords());// 当前页数据
        return coursePage != null ? new RestUtil(200,"",map) : null;
    }


    @Override
    // 课程名称+学号
    public RestUtil querySelectionByPage(Integer current, Integer rows, String search) {
        // 1.根据查询条件判断构造的操作数据库的模糊查询条件
        // 如果search有值的话，就进行分页模糊查询，没有值的话就进行普通查询
        QueryWrapper<Selection> queryWrapper = (search != null && search != "")?
                new QueryWrapper<Selection>().like("cou_name",search) : null;
        // 2.根据mybatis-plus分页查询返回Page对象，MP规定，实现分页查询必须规定一个分页拦截器才会生效
        Page<Selection> selectionPage = selectionMapper.selectPage(new Page<Selection>(current,rows),queryWrapper);
        // 3.选择一个合适的数据结构封装返回的数据 Map数据结构
        HashMap<String, Object> map = new HashMap<>();
        // 4.使用Page对象获取分页显示的信息
        map.put("total",selectionPage.getTotal());// 总条数
        map.put("pages",selectionPage.getPages());// 总页数
        map.put("selections",selectionPage.getRecords());// 当前页数据
        return selectionPage != null ? new RestUtil(200,"",map) : null;
    }

    @Override
    public RestUtil selectSelectionByCouId(Integer couId) {
        Selection selection = selectionMapper.selectOne(new QueryWrapper<Selection>().eq("cou_id",couId));
        if(selection == null) return new RestUtil(200,"可以正常进行选课！",null);
        return new RestUtil(500,"您已经选过该课程！！！",selection);
    }
}
